library(flexdashboard)
## Warning: le package 'flexdashboard' a été compilé avec la version R 4.5.2
library(reticulate)
## Warning: le package 'reticulate' a été compilé avec la version R 4.5.2
library(readr)
library(dplyr)
## Warning: le package 'dplyr' a été compilé avec la version R 4.5.2
## 
## Attachement du package : 'dplyr'
## Les objets suivants sont masqués depuis 'package:stats':
## 
##     filter, lag
## Les objets suivants sont masqués depuis 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
## Warning: le package 'ggplot2' a été compilé avec la version R 4.5.2
library(tidyr)
library(knitr)

# Force R à utiliser l'environnement virtuel de ton projet VSCode
# On remonte d'un niveau (..) car ton Rmd est dans 'Partie1' et .venv est au-dessus
use_virtualenv("../.venv", required = TRUE)

# Importation
surf_lib <- import("surf_scrap")
# 4. Exécuter le scraping
# NETTOYEZ BIEN L'URL : elle doit être une simple chaîne de caractères
URL <- "https://www.surf-report.com/meteo-surf/lacanau-s1043.html"

CSV_OUT <- "data_surf.csv"

# Appel de la fonction Python
surf_lib$scrape_surf_report(URL, output_csv_path = CSV_OUT)
## Les données ont été sauvegardées avec succès dans data_surf.csv
##                    Day  Hour Waves_size Wind_speed
## 1   Vendredi 9 Janvier 06:00  5.2 - 7.8         53
## 2   Vendredi 9 Janvier 09:00  5.2 - 7.8         52
## 3   Vendredi 9 Janvier 12:00  5.4 - 8.1         57
## 4   Vendredi 9 Janvier 15:00  5.3 - 8.0         53
## 5   Vendredi 9 Janvier 18:00  5.0 - 7.6         50
## 6   Vendredi 9 Janvier 21:00  4.7 - 7.1         48
## 7    Samedi 10 Janvier 06:00  4.0 - 6.0         32
## 8    Samedi 10 Janvier 09:00  3.7 - 5.6         33
## 9    Samedi 10 Janvier 12:00  3.6 - 5.4         35
## 10   Samedi 10 Janvier 15:00  3.5 - 5.2         33
## 11   Samedi 10 Janvier 18:00  3.3 - 4.9         29
## 12   Samedi 10 Janvier 21:00  3.1 - 4.6         24
## 13 Dimanche 11 Janvier 06:00  2.3 - 3.5         15
## 14 Dimanche 11 Janvier 09:00  2.1 - 3.1         18
## 15 Dimanche 11 Janvier 12:00  1.8 - 2.7         22
## 16 Dimanche 11 Janvier 15:00  1.6 - 2.4         24
## 17 Dimanche 11 Janvier 18:00  1.4 - 2.1         25
## 18 Dimanche 11 Janvier 21:00  1.3 - 2.0         23
## 19    Lundi 12 Janvier 06:00  1.7 - 2.6         27
## 20    Lundi 12 Janvier 09:00  1.9 - 2.9         33
## 21    Lundi 12 Janvier 12:00  2.1 - 3.1         33
## 22    Lundi 12 Janvier 15:00  2.3 - 3.4         32
## 23    Lundi 12 Janvier 18:00  2.4 - 3.6         31
## 24    Lundi 12 Janvier 21:00  2.4 - 3.6         32
## 25    Mardi 13 Janvier 06:00  2.0 - 3.0         24
## 26    Mardi 13 Janvier 09:00  2.0 - 3.0         33
## 27    Mardi 13 Janvier 12:00  2.3 - 3.4         35
## 28    Mardi 13 Janvier 15:00  2.4 - 3.6         38
## 29    Mardi 13 Janvier 18:00  2.3 - 3.4         36
## 30    Mardi 13 Janvier 21:00  2.2 - 3.3         35
## 31 Mercredi 14 Janvier 06:00  2.5 - 3.8         31
## 32 Mercredi 14 Janvier 09:00  2.8 - 4.2         33
## 33 Mercredi 14 Janvier 12:00  2.9 - 4.4         27
## 34 Mercredi 14 Janvier 15:00  2.9 - 4.4         25
## 35 Mercredi 14 Janvier 18:00  3.0 - 4.6         22
## 36 Mercredi 14 Janvier 21:00  3.0 - 4.5         18
## 37    Jeudi 15 Janvier 06:00  2.2 - 3.3         22
## 38    Jeudi 15 Janvier 09:00  2.0 - 3.0         23
## 39    Jeudi 15 Janvier 12:00  1.8 - 2.7         23
## 40    Jeudi 15 Janvier 15:00  1.7 - 2.6         21
## 41    Jeudi 15 Janvier 18:00  1.6 - 2.4         21
## 42    Jeudi 15 Janvier 21:00  1.5 - 2.3         23
##                       Wind_direction
## 1  Orientation vent Ouest Nord Ouest
## 2             Orientation vent Ouest
## 3  Orientation vent Ouest Nord Ouest
## 4  Orientation vent Ouest Nord Ouest
## 5        Orientation vent Nord Ouest
## 6        Orientation vent Nord Ouest
## 7        Orientation vent Nord Ouest
## 8        Orientation vent Nord Ouest
## 9        Orientation vent Nord Ouest
## 10       Orientation vent Nord Ouest
## 11       Orientation vent Nord Ouest
## 12  Orientation vent Nord Nord Ouest
## 13          Orientation vent Sud Est
## 14          Orientation vent Sud Est
## 15      Orientation vent Sud Sud Est
## 16      Orientation vent Sud Sud Est
## 17              Orientation vent Sud
## 18      Orientation vent Sud Sud Est
## 19              Orientation vent Sud
## 20              Orientation vent Sud
## 21    Orientation vent Sud Sud Ouest
## 22              Orientation vent Sud
## 23              Orientation vent Sud
## 24              Orientation vent Sud
## 25          Orientation vent Sud Est
## 26      Orientation vent Sud Sud Est
## 27              Orientation vent Sud
## 28    Orientation vent Sud Sud Ouest
## 29    Orientation vent Sud Sud Ouest
## 30              Orientation vent Sud
## 31  Orientation vent Ouest Sud Ouest
## 32  Orientation vent Ouest Sud Ouest
## 33            Orientation vent Ouest
## 34            Orientation vent Ouest
## 35            Orientation vent Ouest
## 36            Orientation vent Ouest
## 37        Orientation vent Sud Ouest
## 38    Orientation vent Sud Sud Ouest
## 39              Orientation vent Sud
## 40      Orientation vent Sud Sud Est
## 41          Orientation vent Sud Est
## 42          Orientation vent Sud Est
# 5. Charger les données pour R
data <- readr::read_csv(CSV_OUT)
## Rows: 42 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (3): Day, Waves_size, Wind_direction
## dbl  (1): Wind_speed
## time (1): Hour
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 3. Préparation des KPIs (Nettoyage des plages de données)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.2
## ✔ lubridate 1.9.4     ✔ tibble    3.3.0
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# 2. Préparation des données (Nettoyage pour KPIs)
df_clean <- data %>%
  # On sépare "5.0 - 7.6" pour calculer la moyenne de la plage
  separate(Waves_size, into = c("w_min", "w_max"), sep = " - ", convert = TRUE, remove = FALSE) %>%
  mutate(
    Wave_Mean = (w_min + w_max) / 2,
    Wind_Speed_Num = as.numeric(gsub("[^0-9.]", "", Wind_speed)),
    # Calcul du Score de Qualité (Consigne : <1m wave, <50km/h wind, Nord)
    Is_North = grepl("Nord", Wind_direction),
    Quality_Score = case_when(
      Wave_Mean <= 1.0 & Wind_Speed_Num <= 50 & Is_North ~ 100,
      Wave_Mean <= 2.0 & Wind_Speed_Num <= 60 ~ 60,
      TRUE ~ 30
    ),
    Time_Idx = row_number()
  )

# Identification des moments clés
best_moment <- df_clean %>% arrange(desc(Quality_Score), desc(Wave_Mean)) %>% head(1)
highest_wave <- df_clean %>% arrange(desc(w_max)) %>% head(1)

Row

🏄 Meilleur Moment

valueBox(
  value = paste(best_moment$Day, "@", best_moment$Hour),
  caption = "Meilleur moment pour pratiquer",
  icon = "fa-star",
  color = "success"
)
Dimanche 11 Janvier @ 15:00:00

Row

🌊 Plus haute vague

valueBox(
  value = paste(highest_wave$w_max, "m"),
  caption = paste("Prévue le", highest_wave$Day),
  icon = "fa-arrows-alt-v",
  color = "info"
)
8.1 m

Row

⚓ Qualité de la mer

gauge(best_moment$Quality_Score, min = 0, max = 100, symbol = '%', gaugeSectors(
  success = c(80, 100), warning = c(40, 79), danger = c(0, 39)
))

Row

Analyse de la Houle (Taille Moyenne)

ggplot(df_clean, aes(x = Time_Idx, y = Wave_Mean)) +
  geom_area(fill = "#0077b6", alpha = 0.3) +
  geom_line(color = "#0077b6", size = 1) +
  theme_minimal() +
  labs(x = "Chronologie des prévisions", y = "Taille Moyenne (m)")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Row

🌬️ Évolution du Vent (Vitesse)

ggplot(df_clean, aes(x = Time_Idx, y = Wind_Speed_Num)) +
  geom_col(fill = "#90e0ef") +
  theme_minimal() +
  labs(x = "Chronologie des prévisions", y = "Vitesse (km/h)")

Row

📝 Données Détaillées (Sélection Client)

data %>% 
  select(Day, Hour, Waves_size, Wind_direction) %>% 
  kable()
Day Hour Waves_size Wind_direction
Vendredi 9 Janvier 06:00:00 5.2 - 7.8 Orientation vent Ouest Nord Ouest
Vendredi 9 Janvier 09:00:00 5.2 - 7.8 Orientation vent Ouest
Vendredi 9 Janvier 12:00:00 5.4 - 8.1 Orientation vent Ouest Nord Ouest
Vendredi 9 Janvier 15:00:00 5.3 - 8.0 Orientation vent Ouest Nord Ouest
Vendredi 9 Janvier 18:00:00 5.0 - 7.6 Orientation vent Nord Ouest
Vendredi 9 Janvier 21:00:00 4.7 - 7.1 Orientation vent Nord Ouest
Samedi 10 Janvier 06:00:00 4.0 - 6.0 Orientation vent Nord Ouest
Samedi 10 Janvier 09:00:00 3.7 - 5.6 Orientation vent Nord Ouest
Samedi 10 Janvier 12:00:00 3.6 - 5.4 Orientation vent Nord Ouest
Samedi 10 Janvier 15:00:00 3.5 - 5.2 Orientation vent Nord Ouest
Samedi 10 Janvier 18:00:00 3.3 - 4.9 Orientation vent Nord Ouest
Samedi 10 Janvier 21:00:00 3.1 - 4.6 Orientation vent Nord Nord Ouest
Dimanche 11 Janvier 06:00:00 2.3 - 3.5 Orientation vent Sud Est
Dimanche 11 Janvier 09:00:00 2.1 - 3.1 Orientation vent Sud Est
Dimanche 11 Janvier 12:00:00 1.8 - 2.7 Orientation vent Sud Sud Est
Dimanche 11 Janvier 15:00:00 1.6 - 2.4 Orientation vent Sud Sud Est
Dimanche 11 Janvier 18:00:00 1.4 - 2.1 Orientation vent Sud
Dimanche 11 Janvier 21:00:00 1.3 - 2.0 Orientation vent Sud Sud Est
Lundi 12 Janvier 06:00:00 1.7 - 2.6 Orientation vent Sud
Lundi 12 Janvier 09:00:00 1.9 - 2.9 Orientation vent Sud
Lundi 12 Janvier 12:00:00 2.1 - 3.1 Orientation vent Sud Sud Ouest
Lundi 12 Janvier 15:00:00 2.3 - 3.4 Orientation vent Sud
Lundi 12 Janvier 18:00:00 2.4 - 3.6 Orientation vent Sud
Lundi 12 Janvier 21:00:00 2.4 - 3.6 Orientation vent Sud
Mardi 13 Janvier 06:00:00 2.0 - 3.0 Orientation vent Sud Est
Mardi 13 Janvier 09:00:00 2.0 - 3.0 Orientation vent Sud Sud Est
Mardi 13 Janvier 12:00:00 2.3 - 3.4 Orientation vent Sud
Mardi 13 Janvier 15:00:00 2.4 - 3.6 Orientation vent Sud Sud Ouest
Mardi 13 Janvier 18:00:00 2.3 - 3.4 Orientation vent Sud Sud Ouest
Mardi 13 Janvier 21:00:00 2.2 - 3.3 Orientation vent Sud
Mercredi 14 Janvier 06:00:00 2.5 - 3.8 Orientation vent Ouest Sud Ouest
Mercredi 14 Janvier 09:00:00 2.8 - 4.2 Orientation vent Ouest Sud Ouest
Mercredi 14 Janvier 12:00:00 2.9 - 4.4 Orientation vent Ouest
Mercredi 14 Janvier 15:00:00 2.9 - 4.4 Orientation vent Ouest
Mercredi 14 Janvier 18:00:00 3.0 - 4.6 Orientation vent Ouest
Mercredi 14 Janvier 21:00:00 3.0 - 4.5 Orientation vent Ouest
Jeudi 15 Janvier 06:00:00 2.2 - 3.3 Orientation vent Sud Ouest
Jeudi 15 Janvier 09:00:00 2.0 - 3.0 Orientation vent Sud Sud Ouest
Jeudi 15 Janvier 12:00:00 1.8 - 2.7 Orientation vent Sud
Jeudi 15 Janvier 15:00:00 1.7 - 2.6 Orientation vent Sud Sud Est
Jeudi 15 Janvier 18:00:00 1.6 - 2.4 Orientation vent Sud Est
Jeudi 15 Janvier 21:00:00 1.5 - 2.3 Orientation vent Sud Est

Row

📝 Documentation et Méthodologie (Bonus)

Ce dashboard automatise la récupération des données de surf via un script Python (requests/BeautifulSoup). Les données sont ensuite traitées dans R : - Les plages de taille de vagues sont converties en moyenne arithmétique. - Le score de qualité est calculé selon les critères : Vagues < 1m, Vent < 50km/h et direction Nord.